package com.thinking.in.spring.ioc.dependency.injection;

import com.sun.org.apache.regexp.internal.REUtil;
import com.think.in.spring.ioc.overview.domain.User;
import com.thinking.in.spring.ioc.dependency.injection.annotation.UserGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;

import javax.annotation.Resource;
import java.util.Collection;

/**
 * 限定依赖注入 - qualifier ：
 *
 * @author zjiajia
 * @date 2021/12/31 13:17
 */
public class QualifierAnnotationDependencyInjectionDemo {

    @Autowired
    private User primaryUser;


    /**
     * 默认是注入  superUser , 这里用 Qualifier 限定注入名称，就会注入 user
     */
    @Autowired
    @Qualifier("user")
    private User user;
    /**
     * 注入 没有 @Qualifier 的 Bean
     */
    @Autowired
    private Collection<User> allUsers;
    /**
     * 注入 限定 标注  @Qualifier 的注解的Bean : @UserGroup 也是
     */
    @Autowired
    @Qualifier
    private Collection<User> qualifierUsers;

    /**
     * 注入 限定  @UserGroup 注解的bean
     */
    @Autowired
    @UserGroup
    private Collection<User> userGroupUsers;


    /**
     * 这里是将 user1 user2 分到一个组中 ，也就是有 @qualifier 注解的组
     * ，没有这个注解的是另外一个组
     *
     * @return
     */
    @Bean
    @Qualifier
    public static User user1(){
        return createUser(7);
    }

    @Bean
    @Qualifier
    public static User user2(){
       return createUser(8);
    }

    @Bean
    @UserGroup
    public static User user3(){
        return createUser(9);
    }

    @Bean
    @UserGroup
    public static User user4(){
        return createUser(10);
    }



    public static User createUser(Integer id ){
        User user = new User();
        user.setId(id);
        return user;
    }

    public static void main(String[] args) {
        // 创建 BeanFactory
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

        // xml Bean定义信息 Reader
        XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);
        // 加载配置信息  ，解析 装载 配置文件
        xmlBeanDefinitionReader.loadBeanDefinitions("classpath:/META-INF/dependency-lookup-context.xml");

        // 注册 configuration Class (配置类)
        applicationContext.register(QualifierAnnotationDependencyInjectionDemo.class);

        // 启动Spring 应用上下文
        applicationContext.refresh();

        QualifierAnnotationDependencyInjectionDemo demo = applicationContext.getBean(QualifierAnnotationDependencyInjectionDemo.class);

        User user = demo.user;
        System.out.println("user :  " + user);

        System.out.println("qualifier限定的user" + demo.qualifierUsers);

        System.out.println("user group 限定的 user " + demo.userGroupUsers);



        // 关闭应用上下文
        applicationContext.close();


    }

    /**
     * 注解的形式 ： 首先拿到 UserHolder Bean
     *      让后将 User 作为参数传入
     * @param user      user
     * @return          userHolder
     */
    @Bean
    public UserHolder userHolder(User user){

        return new UserHolder(user);
    }
}
